Install packages

install.packages("imager", dependencies=TRUE)
install.packages("ggplot2")

load the image

library("imager")
# store image data in variable.
img <- load.image("showmewhatugot.png")
# show image via Rstudio
img
dim(img)
[1] 301 169   1   4
imgFrame <- as.data.frame(img)
head(imgFrame)
imgPivot <- reshape(imgFrame,direction="wide",timevar = "cc",idvar = c("x","y"))
head(imgPivot)
names(imgPivot)[3] <- "R"
names(imgPivot)[4] <- "G"
names(imgPivot)[5] <- "B"
head(imgPivot)
library("ggplot2")
imageColor <- rgb(imgPivot[c("R", "G", "B")])
ggplot(data = imgPivot, aes(x = x, y = y)) + 
  geom_point(colour = imageColor) +
  coord_fixed()

kClusters <- 5
kMeansResult <- kmeans(imgPivot[c("R", "G", "B")], centers = kClusters)
kMeansResult$center
          R         G         B
1 0.8602543 0.8895529 0.7134287
2 0.9216964 0.9469119 0.8313661
3 0.2900271 0.2551859 0.2106481
4 0.9012171 0.8197549 0.4552957
5 0.5892334 0.6252089 0.4504169
imgPivot$cluster <- kMeansResult$cluster
clusterColours = rgb(kMeansResult$center)
plot(0, type="n", axes=FALSE, ylab="", xlab="", ylim=c(2,0), xlim=c(0,5))
title("Clusters as colours")
rect(0,0,1,1,col='#ffde00')
rect(1,0,2,1,col='#1c142d')
for (i in 0:(kClusters-1)) {
  rect(i,0,i+1,1,col=clusterColours[i+1])
}
text(0.5,0.5,'1')
SetTextContrastColor <- function(color)
{
  ifelse( mean(col2rgb(color)) > 127, "black", "white")
}
text(0.5,0.5,'1', col=SetTextContrastColor('#FDF700'))

##
#install.packages("plotly")
library("plotly")
Loading required package: ggplot2

Attaching package: ‘plotly’

The following object is masked from ‘package:ggplot2’:

    last_plot

The following object is masked from ‘package:stats’:

    filter

The following object is masked from ‘package:graphics’:

    layout
imgPivotSample <- imgPivot[sample(1:nrow(imgPivot), 1000, replace=FALSE),]
plot <- plot_ly(
    imgPivotSample, x = ~R, y = ~G, z = ~B,
    color = ~cluster, colors = clusterColours,
    marker = list(symbol = "circle", size = 4)
  ) %>%
  add_markers() %>%
  layout(
    scene = list(xaxis = list(title = 'Red', color='#FF0000'),
                 yaxis = list(title = 'Green', color='#00FF00'),
                 zaxis = list(title = 'Blue', color='#0000FF'))
  )
plot
kClustersMax <- 10
wss <- sapply(1:kClustersMax,
        function(k){kmeans(imgPivot[c("R", "G", "B")], k)$tot.withinss})
plot(1:kClustersMax, wss,
       type="b", pch = 19, frame = FALSE,
       xlab="Number of clusters K",
       ylab="Total within-clusters sum of squares")
#Makes a vertical line at 3
abline(v = 3, lty =2)

kMeansResult$centers[imgPivot$cluster,]
          R         G         B
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
2 0.9216964 0.9469119 0.8313661
 [ reached getOption("max.print") -- omitted 50536 rows ]
kColours <- rgb(kMeansResult$centers[imgPivot$cluster,])
ggplot(data = imgPivot, aes(x = x, y = -y)) +  geom_point(colour = kColours) + coord_fixed()

clusterLabel <-  2
grey_scale <- function(colour){
    grey <- colour[1] * 0.2126 + colour[2] * 0.7152 + colour[3] * 0.0722
    return(rgb(grey,grey,grey))
}
color_or_grey <- function(row){
  if(row["cluster"]==clusterLabel){
    return(rgb(row["R"],row["G"],row["B"]))
  }
  else{
    return(grey_scale(as.numeric(row[c("R","G","B")])))
  }
}
imgPivot$splash <- apply(imgPivot,1,color_or_grey)
ggplot(data = imgPivot, aes(x = x, y = -y)) +  geom_point(colour = imgPivot$splash) + coord_fixed()

LS0tCnRpdGxlOiAiQ2x1c3RlcmluZyBJSSBhdHRlbXB0MiIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKSW5zdGFsbCBwYWNrYWdlcwpgYGB7cn0KaW5zdGFsbC5wYWNrYWdlcygiaW1hZ2VyIiwgZGVwZW5kZW5jaWVzPVRSVUUpCmluc3RhbGwucGFja2FnZXMoImdncGxvdDIiKQpgYGAKCmxvYWQgdGhlIGltYWdlCmBgYHtyfQpsaWJyYXJ5KCJpbWFnZXIiKQojIHN0b3JlIGltYWdlIGRhdGEgaW4gdmFyaWFibGUuCmltZyA8LSBsb2FkLmltYWdlKCJzaG93bWV3aGF0dWdvdC5wbmciKQojIHNob3cgaW1hZ2UgdmlhIFJzdHVkaW8KaW1nCgpgYGAKCmBgYHtyfQojIHNob3cgZGF0YSBzdHJ1Y3R1cmUKZGltKGltZykKIyBjb3ZlcnQgaW1nIHRvIGRhdGEgZnJhbWUKaW1nRnJhbWUgPC0gYXMuZGF0YS5mcmFtZShpbWcpCiMgc2hvdyBjb2x1bW5zIGFmdGVyIGNvbnZlcnNpb24gdG8gZGF0YWZyYW1lIHdpdGggc29tZSBkYXRhCmhlYWQoaW1nRnJhbWUpCgojIGV4cGFuZCB0aGUgZGF0YWZyYW1lCmltZ1Bpdm90IDwtIHJlc2hhcGUoaW1nRnJhbWUsZGlyZWN0aW9uPSJ3aWRlIix0aW1ldmFyID0gImNjIixpZHZhciA9IGMoIngiLCJ5IikpCgojIHNob3cgdGhlIGNoYW5nZSBpbiB0aGUgZGF0YSBmcmFtZSB3aXRoIHRoZSBleHRlbnNpb24gb2YgMyBjb2x1bW5zCmhlYWQoaW1nUGl2b3QpCgojIHJlbmFtZSB0aGUgY29sdW1ucwpuYW1lcyhpbWdQaXZvdClbM10gPC0gIlIiCm5hbWVzKGltZ1Bpdm90KVs0XSA8LSAiRyIKbmFtZXMoaW1nUGl2b3QpWzVdIDwtICJCIgoKIyBzaG93IGNvbHVtbnMgd2l0aCBuYW1lIGNoYW5nZQpoZWFkKGltZ1Bpdm90KQpgYGAKCmBgYHtyfQpsaWJyYXJ5KCJnZ3Bsb3QyIikKCiMgY3JlYXRlIGEgbWFwIGZvciB1c2Ugd2l0aCBncmFwaCB0b29sIHRvIGFzc2lzdCB3aXRoIHBsb3R0aW5nIHRoZSBpbWFnZSBpbiBhIGdyYXBoLgppbWFnZUNvbG9yIDwtIHJnYihpbWdQaXZvdFtjKCJSIiwgIkciLCAiQiIpXSkKIyBwbG90IHRoZSBpbWFnZSB1c2luZyBpbWFnZUNvbG9yIGFzIHRoZSByZWZlcmVuY2UuCmdncGxvdChkYXRhID0gaW1nUGl2b3QsIGFlcyh4ID0geCwgeSA9IHkpKSArIAogIGdlb21fcG9pbnQoY29sb3VyID0gaW1hZ2VDb2xvcikgKwogIGNvb3JkX2ZpeGVkKCkKYGBgCgpgYGB7cn0KIyBLbWVhbnMgdGhlIGltYWdlIGRhdGEgdXNpbmcgdGhlIFIsRyxCIGNvbHVtbnMgYW5kIGFkZCB0byB0aGUgZGF0YWZyYW1lCmtDbHVzdGVycyA8LSA1CmtNZWFuc1Jlc3VsdCA8LSBrbWVhbnMoaW1nUGl2b3RbYygiUiIsICJHIiwgIkIiKV0sIGNlbnRlcnMgPSBrQ2x1c3RlcnMpCmtNZWFuc1Jlc3VsdCRjZW50ZXIKaW1nUGl2b3QkY2x1c3RlciA8LSBrTWVhbnNSZXN1bHQkY2x1c3RlcgpgYGAKCmBgYHtyfQojIGlkZW50aWZ5IGFuZCBhc3NpZ24gYSBjb2xvdXIgdG8gdGhlIGNsdXN0ZXJzLCBkaXNwbGF5IGluIGEgY2hhcnQuCmNsdXN0ZXJDb2xvdXJzID0gcmdiKGtNZWFuc1Jlc3VsdCRjZW50ZXIpCnBsb3QoMCwgdHlwZT0ibiIsIGF4ZXM9RkFMU0UsIHlsYWI9IiIsIHhsYWI9IiIsIHlsaW09YygyLDApLCB4bGltPWMoMCw1KSkKdGl0bGUoIkNsdXN0ZXJzIGFzIGNvbG91cnMiKQoKcmVjdCgwLDAsMSwxLGNvbD0nI2ZmZGUwMCcpCnJlY3QoMSwwLDIsMSxjb2w9JyMxYzE0MmQnKQoKZm9yIChpIGluIDA6KGtDbHVzdGVycy0xKSkgewogIHJlY3QoaSwwLGkrMSwxLGNvbD1jbHVzdGVyQ29sb3Vyc1tpKzFdKQp9Cgp0ZXh0KDAuNSwwLjUsJzEnKQoKU2V0VGV4dENvbnRyYXN0Q29sb3IgPC0gZnVuY3Rpb24oY29sb3IpCnsKICBpZmVsc2UoIG1lYW4oY29sMnJnYihjb2xvcikpID4gMTI3LCAiYmxhY2siLCAid2hpdGUiKQp9Cgp0ZXh0KDAuNSwwLjUsJzEnLCBjb2w9U2V0VGV4dENvbnRyYXN0Q29sb3IoJyNGREY3MDAnKSkKCiMjCgojaW5zdGFsbC5wYWNrYWdlcygicGxvdGx5IikKbGlicmFyeSgicGxvdGx5IikKCmltZ1Bpdm90U2FtcGxlIDwtIGltZ1Bpdm90W3NhbXBsZSgxOm5yb3coaW1nUGl2b3QpLCAxMDAwLCByZXBsYWNlPUZBTFNFKSxdCgpwbG90IDwtIHBsb3RfbHkoCiAgICBpbWdQaXZvdFNhbXBsZSwgeCA9IH5SLCB5ID0gfkcsIHogPSB+QiwKICAgIGNvbG9yID0gfmNsdXN0ZXIsIGNvbG9ycyA9IGNsdXN0ZXJDb2xvdXJzLAogICAgbWFya2VyID0gbGlzdChzeW1ib2wgPSAiY2lyY2xlIiwgc2l6ZSA9IDQpCiAgKSAlPiUKICBhZGRfbWFya2VycygpICU+JQogIGxheW91dCgKICAgIHNjZW5lID0gbGlzdCh4YXhpcyA9IGxpc3QodGl0bGUgPSAnUmVkJywgY29sb3I9JyNGRjAwMDAnKSwKICAgICAgICAgICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAnR3JlZW4nLCBjb2xvcj0nIzAwRkYwMCcpLAogICAgICAgICAgICAgICAgIHpheGlzID0gbGlzdCh0aXRsZSA9ICdCbHVlJywgY29sb3I9JyMwMDAwRkYnKSkKICApCgpwbG90CgpgYGAKCmBgYHtyfQprQ2x1c3RlcnNNYXggPC0gMTAKd3NzIDwtIHNhcHBseSgxOmtDbHVzdGVyc01heCwKICAgICAgICBmdW5jdGlvbihrKXtrbWVhbnMoaW1nUGl2b3RbYygiUiIsICJHIiwgIkIiKV0sIGspJHRvdC53aXRoaW5zc30pCnBsb3QoMTprQ2x1c3RlcnNNYXgsIHdzcywKICAgICAgIHR5cGU9ImIiLCBwY2ggPSAxOSwgZnJhbWUgPSBGQUxTRSwKICAgICAgIHhsYWI9Ik51bWJlciBvZiBjbHVzdGVycyBLIiwKICAgICAgIHlsYWI9IlRvdGFsIHdpdGhpbi1jbHVzdGVycyBzdW0gb2Ygc3F1YXJlcyIpCiNNYWtlcyBhIHZlcnRpY2FsIGxpbmUgYXQgMwphYmxpbmUodiA9IDMsIGx0eSA9MikKCmBgYAoKYGBge3J9CmtNZWFuc1Jlc3VsdCRjZW50ZXJzW2ltZ1Bpdm90JGNsdXN0ZXIsXQprQ29sb3VycyA8LSByZ2Ioa01lYW5zUmVzdWx0JGNlbnRlcnNbaW1nUGl2b3QkY2x1c3RlcixdKQpnZ3Bsb3QoZGF0YSA9IGltZ1Bpdm90LCBhZXMoeCA9IHgsIHkgPSAteSkpICsgIGdlb21fcG9pbnQoY29sb3VyID0ga0NvbG91cnMpICsgY29vcmRfZml4ZWQoKQpgYGAKCmBgYHtyfQpjbHVzdGVyTGFiZWwgPC0gIDIKCmdyZXlfc2NhbGUgPC0gZnVuY3Rpb24oY29sb3VyKXsKICAgIGdyZXkgPC0gY29sb3VyWzFdICogMC4yMTI2ICsgY29sb3VyWzJdICogMC43MTUyICsgY29sb3VyWzNdICogMC4wNzIyCiAgICByZXR1cm4ocmdiKGdyZXksZ3JleSxncmV5KSkKfQoKY29sb3Jfb3JfZ3JleSA8LSBmdW5jdGlvbihyb3cpewogIGlmKHJvd1siY2x1c3RlciJdPT1jbHVzdGVyTGFiZWwpewogICAgcmV0dXJuKHJnYihyb3dbIlIiXSxyb3dbIkciXSxyb3dbIkIiXSkpCiAgfQogIGVsc2V7CiAgICByZXR1cm4oZ3JleV9zY2FsZShhcy5udW1lcmljKHJvd1tjKCJSIiwiRyIsIkIiKV0pKSkKICB9Cn0KCgppbWdQaXZvdCRzcGxhc2ggPC0gYXBwbHkoaW1nUGl2b3QsMSxjb2xvcl9vcl9ncmV5KQoKZ2dwbG90KGRhdGEgPSBpbWdQaXZvdCwgYWVzKHggPSB4LCB5ID0gLXkpKSArICBnZW9tX3BvaW50KGNvbG91ciA9IGltZ1Bpdm90JHNwbGFzaCkgKyBjb29yZF9maXhlZCgpCmBgYAoKCgo=